package org.ccay.audit.vo;

import java.io.IOException;
import java.util.Date;

import org.ccay.core.base.BaseResourceVO;
import org.ccay.core.log.CcayLoggerFactory;
import org.ccay.core.log.ILogger;
import org.ccay.core.request.IUserPrincipal;
import org.ccay.core.request.impl.RequestContext;
import org.ccay.core.util.JsonUtil;


/**
 * 审计日志的值对象。
 * Created：2011-9-8
 * @version:
 */
public class LogVO extends BaseResourceVO {

	private ILogger log = CcayLoggerFactory.getLogger(LogVO.class);
	/**
	 * 自动生成的版本序列标识
	 */
	private static final long serialVersionUID = 8772772285884326722L;
	/**
	 * 服务器注解名
	 */
	private String serverName;
	
	public String getServerName() {
		return serverName;
	}

	public void setServerName(String serverName) {
		this.serverName = serverName;
	}
	/** 记录时间 * */
	private Date timeStamp;

	/** 执行者 * */
	private Long userId;
	
	/** 操作者的IP * */
	private String hostIP;

	/** 操作 * */
	private String operation;

	/** 所操作的对象ID * */
	private String objectId;
	
	/** 所操作的对象 * */
	private String operateObject;

	/** 操作所属的主体(类) * */
	private String clazz;

	/** 模块名称 * */
	private String module;

	/** 详细消息 * */
	private String message;

	/** 记录时间过滤条件 - 开始时间 * */
	private Date startDate;

	/** 记录时间过滤条件 - 结束时间 * */
	private Date endDate;
	
	/** 应用名称 * */
	private String applicationName;
	
	/** 日志类型(取值：0,1,2) * */
	private int logType;
	
	/** 登录次数 * */
	private int loginCount;
	
	/**
	 * 维度
	 */
	private String dimension;

	/**
	 * @return timeStamp
	 */
	public Date getTimeStamp() {
		return timeStamp;
	}

	/**
	 * @param timeStamp
	 *            要设置的 timeStamp
	 */
	public void setTimeStamp(Date timeStamp) {
		this.timeStamp = timeStamp;
	}

	/**
	 * @return userId
	 */
	public Long getUserId() {
		return userId;
	}

	/**
	 * @param userId
	 *            要设置的 userId
	 */
	public void setUserId(Long userId) {
		this.userId = userId;
	}

	/**
	 * @return hostIP
	 */
	public String getHostIP() {
		return hostIP;
	}

	/**
	 * @param hostIP
	 *            要设置的 hostIP
	 */
	public void setHostIP(String hostIP) {
		this.hostIP = hostIP;
	}

	/**
	 * @return operation
	 */
	public String getOperation() {
		return operation;
	}

	/**
	 * @param operation
	 *            要设置的 operation
	 */
	public void setOperation(String operation) {
		this.operation = operation;
	}

	/**
	 * @return objectId
	 */
	public String getObjectId() {
		return objectId;
	}

	/**
	 * @param objectId
	 *            要设置的 objectId
	 */
	public void setObjectId(String objectId) {
		this.objectId = objectId;
	}

	/**
	 * @return 操作对象
	 */
	public String getOperateObject() {
		return operateObject;
	}

	/**
	 * @param operateObject 要设置的操作对象
	 */
	public void setOperateObject(String operateObject) {
		this.operateObject = operateObject;
	}

	/**
	 * @return clazz
	 */
	public String getClazz() {
		return clazz;
	}

	/**
	 * @param clazz
	 *            要设置的 clazz
	 */
	public void setClazz(String clazz) {
		this.clazz = clazz;
	}

	/**
	 * @return module
	 */
	public String getModule() {
		return module;
	}

	/**
	 * @param module
	 *            要设置的 module
	 */
	public void setModule(String module) {
		this.module = module;
	}

	/**
	 * @return message
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * @param message
	 *            要设置的 message
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * @return startDate
	 */
	public Date getStartDate() {
		return startDate;
	}

	/**
	 * @param startDate
	 *            要设置的 startDate
	 */
	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	/**
	 * @return endDate
	 */
	public Date getEndDate() {
		return endDate;
	}

	/**
	 * @param endDate
	 *            要设置的 endDate
	 */
	public void setEndDate(Date endDate) {
		this.endDate = endDate;
	}

	/**
	 * 设置应用的名称
	 * 
	 * @author chaowangbang
	 * @since 2011-10-21
	 * @param appName
	 */
	public void setApplicationName(String appName) {
		this.applicationName = appName;
	}

	/**
	 * 获取应用的名称
	 * 
	 * @author chaowangbang
	 * @since 2011-10-21
	 * @return
	 */
	public String getApplicationName() {
		return this.applicationName;
	}



	public int getLogType() {
		return logType;
	}

	public void setLogType(int logType) {
		this.logType = logType;
	}
	
	/**
	 * 获取登录次数
	 * 
	 * @author chaowangbang
	 * @since 2012-06-01
	 * @return
	 */
	public int getLoginCount() {
		return loginCount;
	}
	/**
	 * @param loginCount
	 *            要设置的 loginCount
	 */
	public void setLoginCount(int loginCount) {
		this.loginCount = loginCount;
	}
	
	public int getLogsTableIndex(){
		return RequestContext.getCurrent().getApplication().getLogsTableIndex();
		
	}

	public String getDimension() {
		return dimension;
	}

	public void setDimension(String dimension) {
		this.dimension = dimension;
	}
	
	/**
	 * 构建一些自动需要的属性
	 */
	public void buildAotoAttribute(){
		// 时间
		this.setTimeStamp(new Date());
		
		IUserPrincipal user = RequestContext.getCurrent().getUser();
		
		if(user == null){
			this.setUserId(IUserPrincipal.ANONYMOUS_USERID);
			this.setDimension("{}");
		} else {
			this.setUserId(user.getUserId());
			String dimensionStr = "{}";
			if(null != user.getCurrentDimensions()){
				try {
					JsonUtil.getJsonString(user.getCurrentDimensions());
				} catch (IOException e) {
					log.debug("Can not covent Dimension " +user.getCurrentDimensions() +" to JSON.");
				}
			}
			this.setDimension(dimensionStr);
		}
		
		// 地址标识
		this.setHostIP(RequestContext.getCurrent().getUserIp());
		// 应用的名称
		this.setApplicationName(this.getAppName());
		
		this.setCreationDate(new Date());
		this.setStartDate(new Date());
		this.setEndDate(new Date());
		
	}


}
